package cn.haut.online_read.crawler.sanwenzx;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.nodes.Document;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.xsoup.Xsoup;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author xing
 * @date 2021-05-22 14:41
 */
@Slf4j
public class ArticleCrawler2 implements PageProcessor {

    private Site site = Site.me().setSleepTime(1);
    public static final String NBSP = " ";

    @Override
    public void process(Page page) {
        // 爬取内容

        int pNum = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/p").all().size();
        log.error("num: {}", "" + pNum);
        // 网站目前发现有两种格式，一种是 p 下 很多 span 里放的分开的段落内容，一种是 p 下 span 下由包着一个 span 里边是一整个段落
        // 测试获取 span 下 span 的 text ，
        String testTwoSpanText = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/p[2]/span/span/text()").get();
        String testSpanText = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/p[3]/span/text()").get();
        String testPText = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/p[3]/text()").get();
        String testTbodyText = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/table/text()").get();

        List<String> pList = new ArrayList<>();

        // 内容在 p 的 span 下 的 span 下，一整段
        if(testTwoSpanText != null ) {
            for (int i = 1; i < pNum + 1; i++) {
                String paragraph = page.getHtml()
                        .xpath("//div[@class='content']/table/tbody/tr/td/p[" + i + "]/span/span/text()")
                        .replace(NBSP, "")
                        .get();
                if(!paragraph.isBlank()){
                    pList.add(paragraph);
                }
            }
        }
        // 内容在 p 的 很多 span 下，每个 span 里为一段的一部分
        else if ( testSpanText != null ){
            for (int i = 1; i < pNum + 1; i++) {

                List<String> pTexts = page
                        .getHtml()
                        .xpath("//div[@class='content']/table/tbody/tr/td/p[" + i + "]/span/text()")
                        .replace(NBSP, "")
                        .all();
                StringBuilder paragraphBuilder = new StringBuilder();
                boolean empty = true;
                for (String pText : pTexts) {
                    if(!pText.isBlank()){
                        paragraphBuilder.append(pText);
                        empty = false;
                    }
                }
                if(!empty) {
                    pList.add(paragraphBuilder.toString());
                }
            }
        }
        else if (testTbodyText != null) {
            // 获取
            List<String> all = page.getHtml().xpath("//div[@class='content']/table/tbody/tr/td/table/tbody/tr/td/p/span/text()").all();
            for (String s : all) {
                // 先分离(写这个分支就是因为，有个页面，好多段落在一起)
                String[] split = s.split(NBSP);
                // 遍历
                for (String s1 : split) {
                    // 空格全部去掉
                    s1 = s1.replace(NBSP, "").replace(" ", "");
                    // 不是空，就加进去
                    if(!s1.isEmpty()) {
                        pList.add(s1);
                    }
                }
            }
        }
        // 内容在 p 下，每段接下来的 p 里是一个 <br>
        else {
            // 这里加1 是要对所有 p 获取，然后判断是不是空
            for (int i = 1; i < pNum + 1; i++) {
                String pText = page
                        .getHtml()
                        .xpath("//div[@class='content']/table/tbody/tr/td/p[" + i + "]/text()")
                        .replace(NBSP, "")
                        .replace(" ", "")
                        .replace("　", "")
                        .get();
                log.error(pText);
                // !.isEmpty() 不为空，前面以及把所有空格去掉了
                if (!pText.isEmpty()){
                    // 清除所有空格
                    pList.add(pText);
                }
            }
        }

        page.putField("paragraphs", pList);
    }

    @Override
    public Site getSite() {
        return site;
    }
}
